/* Agente responsavel por mudar o sinal dos semaforos e autorizar ou nao
 	 agentes a passarem pelos cruzamentos em que ele eh responsavel */
 	
/* Initial beliefs and rules */
can_cross(left,right). 	//semaforos abertos inicialmente
next_change(1). 	 	//proximo ciclo que mudara o semaforo			

/* Initial goals */
!identify.

/* Plans */
//Ele responde automaticamente (askOne) as perguntas dos walkers
//de se ele gerencia um determinado quadrante

//Avisa walkers que ele eh um dos azulzinhos que ira controlar os cruzamentos
+!identify : true 
	<- .my_name(N);	//get agent name
	.broadcast(tell,coordinator(N)).
	
//hora de trocar o sinal	
+step(T) : next_change(T)
	<- +next_change(T + 5); 	//seta a proxima troca de sinal
	!change_signal.
	
//hora de trocar o sinal 2
+step(T) : next_change(A) & T > A 
	<- +next_change(T + 5); 	//steps to change signal 
	!change_signal.	

//decidir qual sinal vai ser verde
+!change_signal
	<- my.select_semaphore(ND1,ND2);
	?step(T);
	-next_change(T);
	+next_change(T + 5);	
	?can_cross(Old1,Old2);	
	-can_cross(Old1,Old2); 		
	+can_cross(ND1,ND2);
	change_semaphore(ND1,ND2). 

//walker saiu de um quadrante meu
+street_cell(X,Y,Ob) : responsable_quad(X,Y) & quadrant_occupied(X,Y,Ag) & Ob == empty 	
	<- -quadrant_occupied(X,Y,Ag).
	
//walker entrou em um quadrante meu
+street_cell(X,Y,Ob) : responsable_quad(X,Y) & Ob \== empty 
	<- +quadrant_occupied(X,Y,Ob).	

//ta liberado, avisa que pode passar
+want_cross(X,Y,D)[source(Ag)]
	: responsable_quad(X,Y) & not quadrant_occupied(X,Y,walker)
	& can_cross(AD1,AD2) & (AD1 == D | AD2 == D)
	<- -want_cross(X,Y,D)[source(Ag)]; 		 //para poder receber o pedido denovo
	.send(Ag,tell,can_cross(D)).
	
//Nao ta liberado, apaga a crenca e deixa ele perguntar denovo
+want_cross(X,Y,D)[source(Ag)]
	: responsable_quad(X,Y) & not (quadrant_occupied(X,Y,walker) &
	 can_cross(AD1,AD2) & (AD1 == D | AD2 == D))
	<- -want_cross(X,Y,D)[source(Ag)].  	//para poder receber o pedido denovo
	
//Nao ta liberado 2, apaga a crenca e deixa ele perguntar denovo	
+want_cross(X,Y,D)[source(Ag)]
	: responsable_quad(X,Y) & (quadrant_occupied(X,Y,walker) &
	 can_cross(AD1,AD2) & (AD1 == D | AD2 == D))
	<- -want_cross(X,Y,D)[source(Ag)].  	//para poder receber o pedido denovo
	
		